JavaWeb开发学习笔记之Servlet(一) Servlet与Servlet容器的概念

Servlet的定义

Servlet是一种Java编写的后台服务程序, 主要功能是交互式地浏览和修改数据,生成动态Web内容,可以理解为http请求与数据库或其他程序之间的中间层。

要说清楚什么是Servlet还是得从Servlet容器开始说起。

Servlet容器

Servlet容器(Servlet Container),也可以称为Servlet引擎。是web服务器或应用服务器的一部分。

Servlet本身是不能独立运行的,必须部署到Servlet容器中运行。

由Servlet容器实例化和调用servlet方法,Servlet容器在Servlet生命周期内包含和管理servlet。常见的servlet容器有tomcat, JBoss, Jetty, Web logic等。

我们平常的Servlet开发过程中,接收请求这项工作并不是直接由Servlet来工作的,Servlet并不直接与客户端打交道。真正负责这项工作的是servlet容器。接收请求,监听端口这些工作都是由servlet容器来操作完成的。

随便谷歌一个servlet的hello world教程,里面都会让你写一个servlet,但是从来不会在servlet中写什么监听8080端口的代码,servlet不会直接和客户端打交道!。

tomcat等Servlet容器才是与客户端直接打交道的家伙,它监听了端口,请求过来后,根据url等信息,确定要将请求交给哪个servlet去处理,然后调用那个servlet的service方法,service方法返回一个response对象,tomcat再把这个response返回给客户端。

说起来,Servlet与Servlet容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果。从技术角度来说是为了解耦,通过标准化接口来相互协作。

Servlet的本质是一个接口

其实不用把Servlet想象成一个非常复杂的东西,事实上,Servlet的本质就是一个接口, 接口是用来干嘛的,定义规范!所以我们也可以说,Servlet的本质是一规范, 甚至我们还可以说,J2EE的本质就是一种规范。

Servlet类结构图

以上图片来源Google

Servlet最顶层的就是一个Servlet接口,它里面定义了5个方法

servlet接口定义的是一套处理网络请求的规范,所有实现servlet的类,都需要实现它那五个方法,其中最主要的是两个生命周期方法 init()和destroy(),还有一个处理请求的service(),也就是说,所有实现servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:

  • 你初始化时要做什么
  • 你销毁时要做什么
  • 你接受到请求时要做什么

这就是Java给的一种规范,就像阿西莫夫的机器人三大定律、行尸走肉里Rick的那三个问题一样,规范!

Servlet的工作原理图

图一

图二

Servlet的工作模式

  1. Web Client 向Servlet容器(Tomcat)发出Http请求
  2. Servlet容器接收Web Client的请求
  3. Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中。
  4. Servlet容器创建一个HttpResponse对象
  5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给HttpServlet对象。
  6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息。
  7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据。
  8. Servlet容器把HttpServlet的响应结果传给Web Client。

以上。

参考与引用:

知乎:servlet的本质是什么,它是如何工作的

IBM developerWorks: Servlet工作原理解析——许令波

JavaSchool Servlet教程